【动态规划】最大k乘积问题

Description
     
  设I是一个 n位十进制整数。如果将I划分为 k段,则可得到k个整数。这k个整数的 乘积称为I的一个 k乘积。试设计一个算法,对于给定的 I和 k,求出 I的最大 k乘积。 对于给定的I和k,计算 I的最大 k乘积。  
     
Input
     
 
第1 行中有2个正整数n和 k。正整数 n是序列
的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10) 
 
     
Output
     
 
输出最大k乘积
 
     
Sample Input
     
 
2 1 
15 
 
     
Sample Output

     
 
15
 
 

#include<iostream>  
using namespace std;  
#define N 20  
int m[N][N];  
char num[N];  
  
int atoi(char arr[],int i,int j)  
{  
	int sum=0;  
	while(i<=j)  
	{  
        sum = sum*10+arr[i]-'0';  //此处本来用了函数pow,然后wa了,一直找不到错在何处,  
		i++;		//后来问师兄,才发现原来pow(double,int)   
	} 			//的参数double会使结果又偏差,改掉后就ac了  
    return sum;  
}  
  
int main()  
{  
	int n,k,i,j,l,max,flag;  
	while(cin>>n>>k)  
	{  
		for(i=1;i<=n;i++)  
			cin>>num[i];  
		m[1][1]=num[1]-'0';  
		for(i=2;i<=n;i++)  
			m[i][1]=m[i-1][1]*10+(num[i]-'0'); //初始化第一列  
		for(j=2;j<=k;j++)//按列进行初始化  
		{  
			max=-1;  
			for(i=1;i<=n;i++)  
			{  
				if(j>i)  
					m[i][j]=0;  
				else  
				{  
					for(l=j-1;l<=i-1;l++)  
					{  
						flag=m[l][j-1]*atoi(num,l+1,i);  
						if(flag>max)  
						max=flag;  
					}  
					m[i][j]=max;  
				}  
			}  
		}  
		cout<<m[n][k]<<endl;  
	}  
	return 0;  
}  


//****************************************************************************

改进:对于atoi这个函数实现的功能可进行打表,这样可以加快程序运行速度

//****************************************************************************

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值